Se buscar encontrar la eficiencia de la generación de números pseudo-aletorios a través de los métodos de cuadrados medios y congruencia lineal, para ello se debe seguir el siguiente proceso:
A traves de la misma api generar una semilla diferente.
Encontrar el numero de iteraciones hasta que se repita uno de sus datos.
Generar 100 simulaciones con diferentes semillas.
Generar un histograma con el resultado obtenidos por cada mƩtodo.
Agregar sus conclusiones, opiniones y recomendaciones
Se debe generar un cuaderno de python para la simulación y subir dentro de este apartado.
Nota* para obtener la temperatura del CPU Descargarse OpenHardwareMonitor link https://openhardwaremonitor.org/downloads/ Abra el Monitor de hardware y ejecute el cuaderno
import numpy as np
import matplotlib.pyplot as plt
from tabulate import tabulate
from math import floor
import plotly.graph_objects as go
import wmi
import re
ui22=[]
similar=[]
nn=101
repetidos={}
for ii in range(1,101):
##se recomienda definir la semilla con digitos x0>3
w = wmi.WMI(namespace="root\OpenHardwareMonitor")
t = w.Sensor()
x0= int(re.sub('[\.-]','',str(t[1].Value)[0:5]))
print('Simulacion numero=: ',ii,'Con Semilla=: ',x0)
## NĆŗmero de digitos
digitos= 4
##x0 elevado a la potencia 2
xn=pow(int(x0), 2)
a=len(str(xn))
ban=False
ite=[]
xn2=[]
xi=[]
ui2=[]
rn2=[]
l=[]
for i in range(1,nn):
ite.append(i)
## Elevamos al cuadrado la semilla
xi.append(x0)
x02= pow(int(x0), 2)
##Sacamos la longitud del valor del cuadrado de la semilla
longitud= len(str(x02))
##Determinamos si la longitud es la misma que la inicial
#Si no es usamos el metodo de aƱadir "0" al lado izquierdo del numero
if longitud<a:
x02 = str(x02).zfill(a)
longitud= len(str(x02))
## Calculamos UI en base a los digitos
xn2.append(x02)
l.append(longitud)
cant= str(x02)
aux= floor(len(cant)/2)
di=digitos/2
inicio=int(aux)-int(di)
fin=int(aux)+int(di)
cantt= str(x02)
if digitos%2==0:
ui=cantt[inicio:fin]
else:
ui=cantt[inicio:fin+1]
if(ban==True):
ui2.append(ui)
ui2.remove(ui)
l.remove(longitud)
xn2.remove(x02)
xi.remove(x0)
ite.remove(i)
break
elif(ban==False):
ui2.append(ui)
if(i==nn):
n=+10
for aa in ui2:
if(ui2.count(aa)>1):
ui22.append(i)
similar.append(aa)
repetidos[i]=aa
ban=True
break
dd='1'
dig=dd.ljust(digitos+1,'0')
Rn=int(ui)/int(dig)
rn2.append(Rn)
x0=ui
##generamos una tabla con la libreria plotly.graph_objects
fig = go.Figure(data=[go.Table(header=dict(values=['Iteración','xn', 'xn*xn','Logintud','ui','rn']),cells=dict(values=[ite,xi, xn2, l, ui2, rn2]))])
fig.show()
plt.hist(similar, bins=10, edgecolor = 'black',linewidth=1)
plt.title("Numeros Repetidos")
plt.xlabel("Valores")
plt.ylabel("Cantidad")
plt.show()
plt.hist(ui22, bins=10, edgecolor = 'red',linewidth=1)
plt.title("Iteraciones Repetidas")
plt.xlabel("Iteraciones")
plt.ylabel("Cantidad")
plt.show()
sin=[]
repetidos1={}
uiu=[]
nn=150
for ii in range(1,101):
a = 3
b = 5
m = 19
##Se genera la semilla mediante la temperatura del CPU
w = wmi.WMI(namespace="root\OpenHardwareMonitor")
t = w.Sensor()
x0= int(re.sub('[\.-]','',str(t[1].Value)[0:5]))
print('Simulacion numero=: ',ii,'Con Semilla=: ',x0)
xn1=[]
xnt1=[]
unt1=[]
un1=[]
xn=x0
un=" "
itee=[]
band=False
for i in range(1,nn):
itee.append(i)
xn1.append(xn)
if(band==True):
un1.append(un)
un1.remove(un)
xn1.remove(xn)
itee.remove(i)
break
elif(band==False):
un1.append(un)
if(i==nn):
n=+10
for aaa in un1:
if(un1.count(aaa)>1):
uiu.append(i)
sin.append(aaa)
repetidos1[i]=aaa
band=True
break
xn=(a*xn+b)%m
un=xn/m
fig = go.Figure(data=[go.Table(header=dict(values=["Iteraciones", "xn1","un1"]),
cells=dict(values=[itee, xn1, un1]))])
fig.show()
plt.hist(sin, bins=10, edgecolor = 'black',linewidth=1)
plt.title("Numeros Repetidos")
plt.xlabel("Valores")
plt.ylabel("Cantidad")
plt.show()
plt.hist(uiu, bins=10, edgecolor = 'orange',linewidth=1)
plt.title("Iteraciones Repetidas")
plt.xlabel("Iteraciones")
plt.ylabel("Cantidad")
plt.show()
Se recomienda establecer una semilla >3, y cada semilla de la simulacion de los 100 procesos debe presentar una semilla diferente esto se logra mediante la temperatura del CPU
Por lo tanto dependera mucho de los parametros iniciales para que por cada iteracion exista por lo menos una repetición, por este motivo creo que es mucho mejor hacer uso del metodo de congruencia lineal, independite de las variables este metodo es mas facil de implementar y los resultados son mejores proporcionando una mejor aleatoriedad que el metodo de cuadrados medios.